package 每日一题;

import com.alibaba.fastjson.JSON;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @description:
 * @author: 小白白
 * @create: 2021-11-05
 **/

public class No1218最长定差子序列 {
    /**
     * 给你一个整数数组 arr 和一个整数 difference，
     * 请你找出并返回 arr 中最长等差子序列的长度，该子序列中相邻元素之间的差等于 difference 。
     * 子序列 是指在不改变其余元素顺序的情况下，
     * 通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。
     * <p>
     * 示例 1：
     * 输入：arr = [1,2,3,4], difference = 1
     * 输出：4
     * 解释：最长的等差子序列是 [1,2,3,4]。
     * 示例 2：
     * 输入：arr = [1,3,5,7], difference = 1
     * 输出：1
     * 解释：最长的等差子序列是任意单个元素。
     * 示例 3：
     * 输入：arr = [1,5,7,8,5,3,4,2,1], difference = -2
     * 输出：4
     * 解释：最长的等差子序列是 [7,5,3,1]。
     *  
     * 提示：
     * 1 <= arr.length <= 105
     * -104 <= arr[i], difference <= 104
     */

    public int longestSubsequence(int[] arr, int difference) {

        // num : index
        Map<Integer, Integer> map = new HashMap<>();
        int[] dp = new int[arr.length];

        // base
        dp[0] = 1;
        Arrays.fill(dp, 1);
        map.put(arr[0], 0);

        int result = 1;

        for (int i = 1; i < arr.length; i++) {
            int num = arr[i];
            if (map.containsKey(num - difference)) {
                Integer index = map.get(num - difference);
                dp[i] = dp[index] + 1;
                result = Math.max(result, dp[i]);
            }
            // num : index
            map.put(num, i);
        }

        System.out.println(JSON.toJSONString(dp));

        return result;
    }

    public static void main(String[] args) {
        No1218最长定差子序列 n = new No1218最长定差子序列();
        int[] arr = {1, 8, 7, 6, 3, 5};
        int result = n.longestSubsequence(arr, -1);
    }

}
